import Vue from "vue";

import axios from "axios";
import router from "../router";
import store from "../store";

import {
  Toast,
  Dialog
} from "vant";
// http请求拦截器
//取消请求
let CancelToken = axios.CancelToken;

//设置默认请求头，如果不需要可以取消这一步 http://wx-001.unionnetwork.com

axios.defaults.baseURL = 'http://wx-001.unionnetwork.com/' //设置接口地址

axios.defaults.headers = {
  "Content-Type": "application/json;charset=utf-8"
};

// 请求超时的时间限制
axios.defaults.timeout = 180000;

// 开始设置请求 发起的拦截处理

// config 代表发起请求的参数的实体

axios.interceptors.request.use(
  config => {
    // console.log(config.headers['Content-Type'])

    if (config.headers['Content-Type'] == 'application/json') {
      config.headers["Content-Type"] = "application/json";
    } else {
      // 封装请求头不对 待改进  此处在微信分享 发现用处
      config.headers["Content-Type"] = "application/x-www-form-urlencoded"; //将token放到请求头发送给服务器 
    }
    // Do something before request is sent
    if (store.state.token && store.state.token != "") {
      config.headers["token"] = store.state.token; //将token放到请求头发送给服务器
    }

    // 得到参数中的 requestName 字段，用于决定下次发起请求，取消对应的 相同字段的请求

    // 如果没有 requestName 就默认添加一个 不同的时间戳

    // loadinginstace = Toast.loading({
    //   duration: 0, // 持续展示 toast
    //   forbidClick: true,
    //   message: "加载中..."
    // });
    let requestName;

    if (config.method === "post") {
      if (config.data && config.data.requestName) {
        requestName = config.data.requestName;
      } else {
        requestName = new Date().getTime();
      }
    } else {
      if (config.params && config.params.requestName) {
        requestName = config.params.requestName;
      } else {
        requestName = new Date().getTime();
      }
    }

    // 判断，如果这里拿到的参数中的 requestName 在上一次请求中已经存在，就取消上一次的请求

    if (requestName) {
      if (axios[requestName] && axios[requestName].cancel) {
        // axios[requestName].cancel()
      }

      config.cancelToken = new CancelToken(c => {
        axios[requestName] = {};

        axios[requestName].cancel = c;
      });
    }

    return config;
  },
  error => {
    // element ui Loading方法
    // 返回请求正确的结果

    return Promise.reject(error);
  }
);

// 请求到结果的拦截处理

axios.interceptors.response.use(
  config => {
    // 返回请求正确的结果
    // loadinginstace.close();
    return config;
  },
  error => {
    // console.log(error)
    // 错误的请求结果处理，这里的代码根据后台的状态码来决定错误的输出信息
    // loadinginstace.close();

    if (error && error.response) {
      switch (error.response.status) {
        case 400:
          error.message = "错误请求";
          break;
        case 401:
          if (store.state.Models == 'and') {
            window.android.toReLogin() //重登录
          } else if (store.state.Models == 'ios') {
            window.webkit.messageHandlers.toReLogin.postMessage("ios"); //重登录
          }

          error.message = "未授权，请重新登录";
          setTimeout(() => {
            router.push({
              path: '/login',
              replace: true,
              query: {
                redirect: router.currentRoute.fullPath
              } //登录后再跳回此页面时要做的配置
            });
          }, 1000 * 6)
          Dialog.alert({
            title: '提示',
            message: '未授权，请重新登录',
          }).then(() => {
            //清空登录
            store.state.isLogin = '';
            sessionStorage.clear();
          });


          break;
        case 403:
          error.message = "拒绝访问";

          break;

        case 404:
          error.message = "请求错误,未找到该资源";

          break;

        case 405:
          error.message = "请求方法未允许";

          break;

        case 408:
          error.message = "请求超时";

          break;

        case 500:
          error.message = "服务器端出错";

          break;

        case 501:
          error.message = "网络未实现";

          break;

        case 502:
          error.message = "网络错误";

          break;

        case 503:
          error.message = "服务不可用";

          break;

        case 504:
          error.message = "网络超时";

          break;

        case 505:
          error.message = "http版本不支持该请求";

          break;

        default:
          error.message = `连接错误${error.response.status}`;
      }
    } else {
      // console.log(error)
      error.message = "连接到服务器失败";
    }

    return Promise.reject(error.message);
  }
);

// 将axios 的 post 方法，绑定到 vue 实例上面的 $post
Vue.prototype.$axios = axios;
Vue.prototype.$post = function (url, params) {

  return new Promise((resolve, reject) => {
    axios
      .post(url, params)
      .then(res => {
        if (res.data.code == 401) {
          Dialog.alert({
            title: '提示',
            message: '登录失效，请重新登录',
          }).then(() => {
            //清空登录
            store.state.isLogin = '';
            sessionStorage.clear();
            router.push({
              path: '/login',
              replace: true,
              query: {
                redirect: router.currentRoute.fullPath
              } //登录后再跳回此页面时要做的配置
            });
          });
          this.$publicObj.closeLoading()
        } else {
          resolve(res.data);
        }
      })
      .catch(err => {
        // reject(err.data);
      });
  });
};

// 将axios 的 get 方法，绑定到 vue 实例上面的 $get
Vue.prototype.$get = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params
      })
      .then(res => {
        if (res.data.code == 401) {

          Dialog.alert({
            title: '提示',
            message: '登录失效，请重新登录',
          }).then(() => {
            //清空登录
            store.state.isLogin = '';
            sessionStorage.clear();
            router.push({
              path: '/login',
              replace: true,
              query: {
                redirect: router.currentRoute.fullPath
              } //登录后再跳回此页面时要做的配置
            });
          });
          this.$publicObj.closeLoading();
        } else {
          resolve(res.data); // 返回请求成功的数据 data
        }

      })
      .catch(err => {
        // reject(err.data);
        // console.log(err.data)
      });
  });
};


// 将axios 的 delete 方法，绑定到 vue 实例上面的 $delete
Vue.prototype.$delete = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .delete(url, {
        params: params
      })
      .then(res => {
        // console.log(res.data.code)
        if (res.data.code == 401) {
          Dialog.alert({
            title: '提示',
            message: '登录失效，请重新登录',
          }).then(() => {
            //清空登录
            store.state.isLogin = '';
            sessionStorage.clear();
            router.push({
              path: '/login',
              replace: true,
              query: {
                redirect: router.currentRoute.fullPath
              } //登录后再跳回此页面时要做的配置
            });
          });
          this.$publicObj.closeLoading()

        } else {
          resolve(res.data); // 返回请求成功的数据 data
        }

      })
      .catch(err => {
        // reject(err.data);
      });
  });
};

// 将axios 的 put 方法，绑定到 vue 实例上面的 $put
Vue.prototype.$put = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .put(url, params)
      .then(res => {
        // console.log(res.data.code)
        if (res.data.code == 401) {
          Dialog.alert({
            title: '提示',
            message: '登录失效，请重新登录',
          }).then(() => {
            //清空登录
            store.state.isLogin = '';
            sessionStorage.clear();
            router.push({
              path: '/login',
              replace: true,
              query: {
                redirect: router.currentRoute.fullPath
              } //登录后再跳回此页面时要做的配置
            });
          });
          this.$publicObj.closeLoading()
        } else {
          resolve(res.data); // 返回请求成功的数据 data
        }

      })
      .catch(err => {
        // reject(err.data);
      });
  });
};



export default axios;